#include <iostream>

// 委托构造，允许一个构造函数调用同一个类的其他构造函数来完成初始化工作，
// 有助于减少代码的重复和提高可维护性
// 使用委托构造来减少代码重复
// 将最完整的构造函数作为主构造函数
// 避免过长的委托链
// 确保初始化逻辑集中在一处
// 注意异常安全
// 合理使用默认参数值
// 委托构造是一个强大的特性，它可以：

// 减少代码重复
// 集中初始化逻辑
// 提高代码维护性
// 使构造函数的层次更清晰
// 方便处理默认值和可选参数
class Person
{
public:
    // 主构造函数
    Person(const std::string &name, int age, const std::string &address)
        : name_(name), age_(age), address_(address)
    {
    }

    // 委托构造函数
    Person(const std::string &name, int age)
        : Person(name, age, "Unknown")
    {
    }

    // 委托构造函数
    Person(const std::string &name)
        : Person(name, 0) // 委托上面的委托构造函数
    {
    }

private:
    std::string name_;
    std::string address_;
    int age_;
};

// 委托构造与成员初始化列表
class Example
{
public:
    // 正确：
    Example(int x, int y) : x_(x), y_(y)
    {
    }

    Example(int x) : Example(x, 0) {}

    // 错误，不能同时使用委托构造函数和成员初始化列表
    // Example(int x):Example(x, 0), z_(0){}
private:
    int x_, y_;
    int z_;
};

// 与继承结合使用
class Shape
{
public:
    Shape(int x, int y) : x_(x), y_(y) {}

protected:
    int x_, y_;
};

class Rectangle : public Shape
{
public:
    // 主构造函数
    Rectangle(int x, int y, int width, int height)
        : Shape(x, y), width_(width), height_(height)
    {
    }

    // 使用委托构造创建正方形
    Rectangle(int x, int y, int size) : Rectangle(x, y, size, size) {}

private:
    int width_, height_;
};